package main

import "fmt"

func main() {
	//testFunc1()
	//testFunc2()
	//testFunc3()
	//testFunc4()
	testFun5()
}

//测试函数
func testFunc1() {
	f1 := add //函数也是变量
	fmt.Printf("f1 的类型是：%T\n", f1)

}

//函数体
func add(a, b int) int {
	return a + b
}

//匿名函数
func testFunc2() {
	f2 := func(a, b int) int {
		return a + b
	}

	fmt.Printf("f2 的类型是：%T\n", f2)

	sum := f2(1, 2)
	fmt.Printf("sum = ：%v\n", sum)
}

// 与 testFunc4 对比 输出 0
func testFunc3() {
	var i int = 0
	defer fmt.Printf("defer i = %v\n", i)
	i = 100
	return
}

//输出 100
func testFunc4() {
	var i int = 0
	defer func() {
		defer fmt.Printf("defer i = %v\n", i)
	}()
	i = 100
	fmt.Printf("i = %v\n", i)
	return
}

func testFun5() {
	sum := calc(100, 200, sub)
	fmt.Printf("sum = %v\n", sum)
}
func sub(a, b int) int {
	return a - b
}

func calc(a, b int, op func(int, int) int) int {
	return op(a, b)
}
